<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
	<title></title>
</head>
<body>

</body>
<script type="text/javascript">
//函数调用形式：
	// 声明一个函数，并调用。
	function func() {
		alert('hello world');
	}
	func();
	// 或者：
	var func = function() {
		alert('hello world');
	}
	func();
// 在函数调用模式中，函数里的this关键字指全局对象，如果在浏览器中就是window对象。
	var func = function() {
		alert(this); //[object window]
	}
	func();

// 方法调用模式：
     // 定义一个函数
     var func = function() {
     	alert('我是谁');
     };
     // 将其赋值给一个对象
     var o = {};
     o.fn = func; //这里不要加圆括号。
     //调用
     o.fn();
     alert(o.fn === func) //true

     var func = function() {
		alert(this);
	 };
	 var o = {};
	 o.fn = func;
	 // 比较
	 alert(o.fn === func); //true
	 // 调用
	 func(); //[object window]   函数调用，this指全局对象。
	 o.fn(); //[object Object] 方法调用：this指当前对象。

// 构造器调用模式:

  // 1.构造函数中的this指的就是被创建的对象。
  // 2.构造函数中的return:在构造函数中，如果返回的是一个对象，那么就保留原意。如果返回的是非对象，比如数字、布尔和字符串，那么就返回 this，如果没有 return 语句，那么也返回 this.
     // 定义一个构造函数
     var Person = function() {
     	this.name = "lxt";
     	this.sayHi = function() {
     		alert("你好，这里是" + this.name);
     	};
     };
     // 调用构造器，创建对象
     var p = new Person();
     // 使用对象
     p.sayHi();
  // 函数作为构造器有几个变化：
     // 1.所有需要由对象使用的属性，必须使用this引导；
     // 2.函数的return语句意义被改写，如果返回非对象，就返回this.

// apply,call调用模式：this可以随意指定，在apply模式中如果使用null，就是函数模式，如果使用对象，就是方法模式。
      // 一个数组的例子
	var arr1 = [1,2,3,[4,5],[6,7,8]];
	// 将其展开
	var arr2 = arr1.conact.apply([], arr1);
	//call 模式与 apply 模式最大的不同在于 call 中的参数不用数组.

	// 定义方法
	var func = function(name, age, sex) {
	    this.name = name;
	    this.age = age;
	    this.sex = sex;
	};
	// 创建对象
	var o = {};
	// 给对象添加成员
	// apply 模式
	var p1 = func.apply(o, ["赵晓虎", 19, "男"]);
	// call 模式
	var p2 = func.call(o, "赵晓虎", 19, "男");
</script>

</html>